from lxml import html

# 假设你已经有了一个HTML字符串
html_content = """  
<html>  
<body>  
<ul>  
    <li>Item 1 text  
        <span>Extra text 1</span>  
        <ul>  
            <li>Subitem 1.1</li>  
            <li>Subitem 1.2</li>  
        </ul>  
        More text 1  
    </li>  
    <li>Item 2 text  
        <span>Extra text 2</span>  
    </li>  
</ul>  
</body>  
</html>  
"""

# 解析HTML
tree = html.fromstring(html_content)


# 定义一个函数来递归地处理li元素
def process_li(li_element):
    # 初始化结果字典
    result = {"text": "", "subitems": []}

    # 提取li元素自身的文本（如果有的话）
    if li_element.text and li_element.text.strip():
        result["text"] += li_element.text.strip()

        # 处理子元素
    for child in li_element:
        if child.tag == 'ul':
            # 如果是ul元素，递归处理并添加到subitems中
            result["subitems"].extend(process_ul(child))
        else:
            # 如果是其他元素，提取其文本并添加到当前li的文本中
            if child.text and child.text.strip():
                result["text"] += child.text.strip()
            if child.tail and child.tail.strip():
                result["text"] += child.tail.strip()

                # 提取li元素的尾部文本（如果有的话）
    if li_element.tail and li_element.tail.strip():
        result["text"] += li_element.tail.strip()

        # 去除文本两端的空白字符
    result["text"] = result["text"].strip()

    # 返回结果字典
    return result


# 定义一个函数来递归地处理ul元素
def process_ul(ul_element):
    subitems = []
    for li_element in ul_element:
        subitems.append(process_li(li_element))
    return subitems


# 找到所有的li元素（这里我们直接找ul下的li，以便从顶层开始处理）
uls = tree.xpath('//ul')

# 遍历每个ul元素并处理其下的li元素
for ul in uls:
    nested_list = process_ul(ul)
    for item in nested_list:
        print(item)
